// controllers/userController.js
const jwt = require('jsonwebtoken');
const db = require('../config/db');
const secretKey = 'my_secret_key';
const crypto = require('crypto');
const { client, storeTokenInRedis } = require('../config/redis');
const svgCaptcha = require("svg-captcha");

function MD5(password) {
    return crypto.createHash('md5').update(password).digest('hex');
}

exports.login = (req, res) => {
    const { username, password } = req.body;
    if (!username || !password) {
        return res.status(403).json({ message: '请输入账号或密码' });
    }
    const sqlCheckUsername = 'SELECT * FROM os_users WHERE username = ?';
    db.query(sqlCheckUsername, [username], (err, results) => {
        if (err) {
            return res.status(500).send('查询数据库失败');
        }
        if (results.length === 0) {
            return res.status(404).json({ message: '账号不存在' });
        } else {
            const user = results[0];
            const storedPassword = user.password;
            if (MD5(password) === storedPassword) {
                const token = jwt.sign(
                    {
                        userId: user.id,
                        role: user.role
                    },
                    secretKey);
                storeTokenInRedis(token, user.id);
                res.status(200).json({ message: '登录成功', data: results, token: token });
            } else {
                res.status(401).json({ message: '密码错误' });
            }
        }
    });
};

exports.logout = async (req, res) => {
    const authHeader = req.headers.authorization;
    if (!authHeader) {
        return res.status(401).json({ message: '请提供有效的token' });
    }
    const token = authHeader.split(' ')[1];
    try {
        await client.del(token);
        res.status(200).json({ message: '账号已退出' });
    } catch (err) {
        res.status(500).json({ message: '退出登录时发生错误' });
    }
};

exports.code = (req, res) => {
    const img = svgCaptcha.createMathExpr({
        // size: 6, // 验证码长度
        // ignoreChars: '0o1il', // 验证码字符中排除 0o1i
        mathMin: 1, // 运算中的最小数字
        mathMax: 9, // 运算中的最大数字
        mathOperator: '+', // 只使用加法运算符,避免出现负数
        color: true, // 验证码是否有彩色
        noise: 6, // 干扰线数量
        background: 'white', // 背景颜色
        width: 120, // 图片宽度
    })
    res.status(200).json(img);
};